package negModel;

import java.util.*;

public class Carrera{
		private Pista pista;
		private Auto autoJugador;
		private Auto autoOponente;
		private AlgoPesos premio;
		private Timer timer;
		private Semaforo semaforo;
		private boolean carreraTerminada;
		private boolean gano;
	
	
	public Carrera(Pista p,Auto aj, Auto ao, AlgoPesos algop){
		this.pista=p;
		this.autoJugador=aj;
		this.autoOponente=ao;
		this.premio=algop;
		this.semaforo = new Semaforo(6);
		this.timer = new Timer();
		this.carreraTerminada = false;
		this.gano=false;
	}
	
	
	
	public void iniciarCarrera(){
		
		Inicializar();
		
		semaforo.iniciarConteo();
		
		timer.schedule(new Temporizador(), 100, 100);		
		
	}
	
	private boolean HayGanador(double rj, double ro, double l){
		if((rj>=l)||(ro>=l)){
			return(true);
				}  
		else return(false);
						
			
	}
	
	public void Inicializar(){
		autoOponente.Resetear();
		autoJugador.Resetear();
	}
	private void detenerTimer(){
		timer.cancel();
	}
	
	public boolean getGanador(){
		return gano;
	}
	
	private void setGanador(){
		if((autoJugador.getRecorrido()>=pista.getLongitud())){
			gano=true;
		}
	}
	
	private class Temporizador extends TimerTask{
		
		public  void run() {
			
			if (semaforo.termino()){
				autoJugador.evaluarPedales();
				autoOponente.acelerar();
				autoOponente.avanzar(pista.getCoeficiente());
				autoJugador.avanzar(pista.getCoeficiente());
			}
				
				if(HayGanador(autoJugador.getRecorrido(),autoOponente.getRecorrido(),pista.getLongitud())){
					detenerTimer();
					carreraTerminada = true;
					setGanador();
									
				}
		}
	}
	
	public String quienVaGanando(){
		String name = null;
		
		if (autoJugador.getRecorrido() > autoOponente.getRecorrido())
			name = "el auto del jugador";
		else if (autoJugador.getRecorrido() < autoOponente.getRecorrido())
			name = "el auto oponente";
		else
			name = "";
		return name;
	}
	
	public AlgoPesos getPremio(){
		return(this.premio);
		
	}
	
	public Semaforo getSemaforo(){
		return semaforo;
	}

	public boolean termino(){
		return carreraTerminada;
	}
	
	public void terminarCarrera() {
		this.carreraTerminada = true;
		if (autoJugador.getRecorrido() > autoOponente.getRecorrido())
			this.gano = true;
		else
			this.gano = false;
		detenerTimer();		
	}
		
			
}
